<?php
/**
 * Created by PhpStorm.
 * User: wolf
 * Date: 2018/6/25
 * Time: 16:10
 */

/**
 * 公用的方法  返回json数据，进行信息的提示
 * @param $status 状态
 * @param string $message 提示信息
 * @param array $data 返回数据
 */
function show($status,$message = '',$data = array()){
    $result = array(
        'code' => $status,
        'info' =>$message,
        'data' =>$data
    );
    exit(json_encode($result));
}

/*
 * @param $url
 * @param int $type 0 get 1 post
 * @param array $data
 */
function doCurl($url,$type=0,$data=[]){
    $ch=curl_init();    // 初始化
    // 设置选项
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($ch,CURLOPT_HEADER,0);
    if($type == 1){
        // post
        curl_setopt($ch,CURLOPT_POST,1);
        curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
    }
    // 执行并获取内容
    $output=curl_exec($ch);
    // 释放curl 权柄
    curl_close($ch);
    return $output;
}

/**
 * 获取两个经纬度之间的距离
 * @param  string $lat1 纬一
 * @param  String $lng1 经一
 * @param  String $lat2 纬二
 * @param  String $lng2 经二
 * @return float  返回两点之间的距离
 */
function calcDistance($lat1, $lng1, $lat2, $lng2) {
    /** 转换数据类型为 double */
    $lat1 = doubleval($lat1);
    $lng1 = doubleval($lng1);
    $lat2 = doubleval($lat2);
    $lng2 = doubleval($lng2);
    /** 以下算法是 Google 出来的，与大多数经纬度计算工具结果一致 */
    $theta = $lng1 - $lng2;
    $dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) +  cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
    $dist = acos($dist);
    $dist = rad2deg($dist);
    $miles = $dist * 60 * 1.1515;
    return ($miles * 1.609344);
}

/**
 * php代码
 *计算某个经纬度的周围某段距离的正方形的四个点
 *@param float $lng  经度
 *@param float $lat  纬度
 *@param float $distance  该点所在圆的半径，该圆与此正方形内切，默认值为5千米
 *@return array 正方形的四个点的经纬度坐标
 */

function squarePoint($lat, $lng,$distance = 5.0){
    $earth_radius = 6371;//地球半径
    $dlng =  2 * asin(sin($distance / (2 * $earth_radius)) / cos(deg2rad($lat)));
    $dlng = rad2deg($dlng);
    $dlat = $distance/$earth_radius;
    $dlat = rad2deg($dlat);
    return [
        'left-top'    =>['lat'=>$lat + $dlat, 'lng'=>$lng - $dlng],
        'right-top'   =>['lat'=>$lat + $dlat, 'lng'=>$lng + $dlng],
        'left-bottom' =>['lat'=>$lat - $dlat, 'lng'=>$lng - $dlng],
        'right-bottom'=>['lat'=>$lat - $dlat, 'lng'=>$lng + $dlng],
    ];
}

/**
 * $lat：用户维度
 * $lng：用户精度
 * $as_name：查询出来的SQL字段名称
 */
function get_distance_sql($lat,$lng,$as_name='distance')
{
    //define('PI',3.1415926535898);
    return sprintf('round(6378.137*sqrt( pow((PI()*(abs(`latitude`-%f))/180) * cos(PI()*(`latitude`+%f)/360),2) 
   + pow((PI()*abs(`longitude`-%f)/180),2)),4) as %s',$lat,$lat,$lng,$as_name);
}

/**
 * $page：页数
 * $num： 条数
 */
function customPage($page=1,$num=1){

    if(!is_numeric($num) || !is_numeric($num))
    {
        return ['begin'=>0,'end'=>9];
    }

    if($page > 1 && $num > 0){
        return ['begin'=>($page-1)*$num,'end'=>$num];
    }else if($page = 1 && $num > 0){
        return ['begin'=>0,'end'=>$num];
    }
}

/**
 * 生成随机订单号
 */
function randID(){
    return date('Ymd') . str_pad(mt_rand(1, 99999), 5, '0', STR_PAD_LEFT);
}

/**
 * 获取真实ip
 */
function get_ip(){

    $unknown = 'unknown';
    if ( isset($_SERVER['HTTP_X_FORWARDED_FOR']) && $_SERVER['HTTP_X_FORWARDED_FOR'] && strcasecmp($_SERVER['HTTP_X_FORWARDED_FOR'], $unknown) ) {
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else if ( isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], $unknown) ) {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    /*
    处理多层代理的情况
    或者使用正则方式：$ip = preg_match("/[\d\.]{7,15}/", $ip, $matches) ? $matches[0] : $unknown;
    */
    if (false !== strpos($ip, ','))
        $ip = reset(explode(',', $ip));
    return $ip;
}



/**
 * xml数组
 */
function xmlToArray($xml){
    //禁止引用外部xml实体
    libxml_disable_entity_loader(true);
    $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
    $val = json_decode(json_encode($xmlstring), true);
    return $val;
}
// 生成流水号
function createNum($num)
{
    $i = intval(substr($num, 6));
    $f = date('Ym');
    if (substr($num, 0, 6) < $f) {
        return $f . '0001';
    } else {
        $i += 1;
        if ($i < 10) {
            return $f . '000' . $i;
        } else if ($i < 100) {
            return $f . '00' . $i;
        } else if ($i < 1000) {
            return $f . '0' . $i;
        } else {
            return $f . $i;
        }
    }
}

// 封装 更好的 Debug 函数 dd => dda
function dda($model)
{
    if (method_exists($model, 'toArray')) {
        dd($model->toArray());
    } else {
        dd($model);
    }
}